 
/* 
 * Copyright (C) Ignacio Lucas
 */
 
/*
 *  Implementacion simplificada del protocolo HTTP.
 *
 *  Ignacio Lucas <ignacio.lucas@gmail.com>
 *
 */
#if !defined(HTTP_UTILITY_H)
#define HTTP_UTILITY_H

#include "../common.h"
#include "http_parser.h"
#include "../socket.h"
#include "../utils/hashmap.h"

typedef struct s_http_request *http_request_t;

typedef struct s_http_response *http_response_t;

// inicializacion del modulo http.
int http_init();

// destruccion del modulo http.
int http_destroy();

// para el object pool del socket buffer
size_t http_get_socket_buffer_size();

// para el object pool del incremental buffer
size_t http_get_incremental_buffer_size();

// metodos para la request.

// creacion de una request.
http_request_t http_request_create(enum http_method method,	unsigned short http_major, unsigned short http_minor, char *request_path);

// asigna un socket al request.
int http_request_set_socket(http_request_t request, socket_t socket);

// devuelve el socket asociado a un request.
socket_t http_request_get_socket(http_request_t request);

// parsea y construye un request a partir de la lectura del socket.
http_request_t http_request_parse(socket_t socket);

// agrega un encabezado al request.
int http_request_add_header(http_request_t request, const char *key, const char *val);

// quita un encabezado del request.
int http_request_remove_header(http_request_t request, const char *key);

// devuelve el hashmap con todos los encabezados de un request.
hashmap_t http_request_get_headers(http_request_t request);

// devuelve el path de requerimiento de un request.
char * http_request_get_request_path(http_request_t request);

// devuelve la URL del request.
char * http_request_get_request_url(http_request_t request);

// devuelve el valor de un header a partir de su nombre.
int http_request_get_header(http_request_t request, const char *key, char **value);

// agrega un parametro al request
int http_request_add_parameter(http_request_t request, const char *key, const char *val);

// devuelve el valor de un parametro del request a partir de su nombre.
char* http_request_get_parameter(http_request_t request, const char *key);

// devuelve todos los parametros del request.
hashmap_t http_request_get_parameters(http_request_t request);

// asigna un cuerpo al request (para metodo POST)
int http_request_set_body(http_request_t request, const char *body, int body_len, int keepref);

// devuelve el cuerpo de un request (para metodo POST)
int http_request_get_body(http_request_t v, const char **body, int *body_len);

// envia un request por el socket indicado, serializando el request segun el protocolo HTTP.
int http_request_serialize_and_send_on_socket(http_request_t request, socket_t socket);

// similar a "http_request_serialize_and_send_on_socket", pero enviado sobre el socket asociado al request (ver "http_request_set_socket").
int http_request_serialize_and_send(http_request_t request);

// destruye un request.
int http_request_destroy(http_request_t request, int is_socket_destroy);

// para el object pool. Devuelve el tamanio de un request.
size_t http_get_request_size();

// metodos del response 

// crea un response.
http_response_t http_response_create(http_request_t request);

// setea un socket asociado al response.
int http_response_set_socket(http_response_t response, socket_t socket);

// devuelve el socket asociado al response.
socket_t http_response_get_socket(http_response_t response);

// parsea y construye un response a partir de la lectura del socket.
http_response_t http_response_parse(socket_t socket);

// agrega un encabezado al response.
int http_response_add_header(http_response_t response, const char *key, const char *val);

// devuelve todos los encabezados de un response.
hashmap_t http_response_get_headers(http_response_t response);

// devuelve un encabezado del response a partir de su nombre.
int http_request_get_header(http_request_t request, const char *key, char **value);

// asigna un codigo de estado al response (10X, 20X, 30X, 40X, 50X).
int http_response_set_status_code(http_response_t response, int status_code);

// asigna la version de protocolo al response (1.0, 1.1).
int http_response_set_version(http_response_t response, unsigned short http_major, unsigned short http_minor);

// setea el cuerpo del response.
int http_response_set_body(http_response_t v, const char *body, int body_len, int keepref);

// devuelve el cuerpo del response.
int http_response_get_body(http_response_t v, const char **body, int *body_len);

// devuelve el codigo de estado del response.
int http_response_get_status_code(http_response_t response);

// envia un response por el socket indicado, serializando el request segun el protocolo HTTP.
int http_response_serialize_and_send_on_socket(http_response_t response, socket_t socket);

// similar a "http_response_serialize_and_send_on_socket", pero enviado sobre el socket asociado al request (ver "http_response_set_socket").
int http_response_serialize_and_send(http_response_t response);

// destruye un response.
int http_response_destroy(http_response_t response, int is_socket_destroy);

// para el object pool. Devuelve el tamanio de un response.
size_t http_get_response_size();

#endif
